"""
2. 两数相加

给你两个 非空 的链表，表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的，并且每个节点只能存储 一位 数字。
请你将两个数相加，并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外，这两个数都不会以 0 开头。
输入：l1 = [2,4,3], l2 = [5,6,4]
输出：[7,0,8]
解释：342 + 465 = 807.
示例 2：

输入：l1 = [0], l2 = [0]
输出：[0]
示例 3：

输入：l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出：[8,9,9,9,0,0,0,1]
 

提示：

每个链表中的节点数在范围 [1, 100] 内
0 <= Node.val <= 9
题目数据保证列表表示的数字不含前导零
"""
def add_two_numbers_one(l1, l2):
    """
    :type l1: Optional[ListNode]
    :type l2: Optional[ListNode]
    :rtype: Optional[ListNode]
    """
    len1 = len(l1)
    len2 = len(l2)
    max_len = max(len1, len2)
    carry  = 0
    result = [0 for _ in range(max_len)]
    for i in range(max_len):
        l1_num = 0
        l2_nmm = 0
        if i <= len1 -1:
            l1_num = l1[i]

        if i <= len2 -1:
            l2_nmm = l2[i]

        total = l1_num + l2_nmm + jin_wei
        if (total >= 10) :
            carry  = 1
        else :
            carry  = 0
        result[i] = total % 10
    if (carry == 1) :
        result.append(1)

    return result

class ListNode(object):
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

def add_two_numbers(l1, l2):
    """
    :type l1: Optional[ListNode]
    :type l2: Optional[ListNode]
    :rtype: Optional[ListNode]
    """
    res_head = ListNode(0)
    current = res_head
    carry = 0
    while l1 or l2 or carry:
        l1_val = l1.val if l1 else 0
        l2_val = l2.val if l2 else 0
        total = l1_val + l2_val + carry
        carry = total // 10
        current.next = ListNode(total % 10)
        if l1: l1 = l1.next
        if l2: l2 = l2.next

    return res_head.next
